local oo = require("SharedLibs.BaseLib")

ISignal = require("SharedLibs.Signal.ISignal")
IProperty = require("SharedLibs.Signal.IProperty")

Signal = require("SharedLibs.Signal.Signal")

--[[
	Property可以缓存数据，不过它只缓存最后一条数据。
	可以用GetValue()读取当前数据（可能是nil）。

	Property也是一个Signal，它触发的就是它数据变化的信号。
]]
local cls = oo.class();
cls:implements(ISignal);
cls:implements(IProperty)

--[[
	接收最多两个参数：value, name
]] 
function cls:constructor(...)
	self._changed = Signal.new();
	--- 如果同样的值反复设置，是否处罚changed事件。	
	local paramCount = select("#", ...);	
	if paramCount == 0 then
	elseif paramCount == 1 then
		self._val = ...;
		self.name = "Property";
	elseif paramCount == 2 then
		self._val, self.name = ...;
	else
		self.name = "Property";
	end

	self._changed.name = self.name;
end

function cls:On(handler, retDestroyer)
	self._changed:On(handler);

	if retDestroyer then return function() self:Off(handler); end end	
end

function cls:Off(handler)
	self._changed:Off(handler);
end

function cls:GetValue()
	return self._val;
end

--- 和UpdateValue的区别是如果当前值和value相同，不会触发changed事件
function cls:SetValue(val)
	if val == self._val then return end;
	self._val = val;
	self._changed:Emit(val);
end

cls.Get = cls.GetValue;
cls.Set = cls.SetValue;

--- 和SetValue的区别是: 即使value和当前值相同，也会触发changed事件
function cls:EmitValue(val)
	if val then
		self._val = val;
		self._changed:Emit(val);
	else
		self._changed:Emit(self._val);
	end
end

--- 和SetValue的区别是不触发事件
function cls:SilentSetValue(value)
	if value == self._val then return end;
	self._val = value;
end

--- 清空所有Listener
function cls:Clear()
	self._changed:Clear();
end

return cls;